package com.hjs.juc;

import java.util.Random;
import java.util.concurrent.*;

/**
 *
 * * 一.线程池：提供一个线程队列，队列中保存着所有等待状态的线程，
 *    避免了创建和销毁线程的额外开销，提高了响应的速度
 * 二.
 *     java.util.concurrent.Executor: 负责线程的使用与调度的根接口
 *          -- ExecutorService 子接口:线程池的主要接口
 *             -- ThreadPoolExecutor :实现类
 *             -- ScheduledExecutorService 子接口：用于线程调度的接口
 *                -- ScheduledThreadPoolExecutor 实现类：继承了ThreadPoolExecutor，实现了ScheduledExecutorService
 * 三.工具类Executors
 *      ExecutorServie newFixedThreadPool() :创建固定大小的线程池
 *      ExecutorServie newCachedThreadPool() :创建缓存线程池，数量不固定，可自动更改数量
 *      ExecutorServie newSingleThreadExecutor() :创建单个线程池
 *
 *      ScheduledExecutorService newScheduledThreadPool() :创建固定大小的线程池，可以延迟或者定时的执行任务
 *
 *      ExecutorServie newFixedThreadPool() :创建固定大小的线程池
 *      ExecutorServie newFixedThreadPool() :创建固定大小的线程池
 *
 *
 * @author hanjinsong
 * @date 2020-02-20 10:37
 */
public class TestScheduledThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);
        for (int i = 0; i < 5; i++) {
            ScheduledFuture<Integer> result = pool.schedule(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int i = new Random().nextInt(100);
                    System.out.println(Thread.currentThread().getName() + " : " + i);
                    return i;
                }
            }, 1, TimeUnit.SECONDS);
            System.out.println(result.get());
        }
        pool.shutdown();
    }

}
